Подключение агента

С помощью этого сценария агентский клиент сам создаёт запрос доступа, ждёт решения владельца проекта и один раз получает первый Agent Token.

Человек всё равно участвует в подключении: агент не может сам назначить себе проект, роль или права. Владелец проверяет запрос и одобряет только необходимый набор permissions.

После получения токена агент переходит к обычным методам Gigma из раздела Агентский доступ.

Результат

В конце сценария у вас будут:

  • отдельная учётная запись агента в проекте;
  • Agent Token со сроком действия;
  • подтверждённый список прав;
  • проверенное подключение через GET /api/user;
  • готовый список разрешённых инструментов.

Кто участвует

УчастникЧто делает
Агентский клиентсоздаёт запрос, хранит request_token, проверяет статус, вызывает consume
Подтверждающий человекполучает письмо, проверяет запрос, одобряет или отклоняет permissions
Gigmaсвязывает запрос с проектом подтверждающего, создаёт учётную запись агента и выдаёт токен

Подтверждающим может быть незаблокированный человек с проектом:

  • владелец или администратор;
  • пользователь с edit-admins;
  • пользователь с edit-permissions.

Учётная запись агента подтверждать запрос не может.

Перед началом

Подготовьте:

  • e-mail человека, который может подтвердить доступ; он должен совпадать с его login в Gigma;
  • понятное имя агента;
  • уникальный технический login агента;
  • минимальный список permissions;
  • короткое описание назначения;
  • хранилище секретов для request_token и Agent Token.

Для первого подключения рекомендуется:

{
	"permissions": [
		"view-orders",
		"view-counterparties"
	],
	"purpose": "Читать заказы и готовить сводки"
}

owner_email должен совпадать с login подтверждающего пользователя Gigma. API намеренно не сообщает, найден ли такой пользователь: при неизвестном или неподходящем e-mail запрос всё равно может получить 201, но останется pending до истечения срока.

Учётная запись агента не поддерживает обычный вход сотрудника через:

POST /api/send_password
POST /api/login

Для is_agent = true эти методы возвращают 403.

Состояния запроса

Запрос действует 30 минут.

СтатусДействие клиента
pendingпродолжать редкий опрос статуса
approvedодин раз вызвать consume
declinedостановить процесс и показать отказ
expiredсоздать новый запрос
consumedиспользовать сохранённый Agent Token; повторный consume секрет не вернёт
create
  └─ pending
       ├─ approved ─ consume ─ consumed
       ├─ declined
       └─ expired

Шаг 1. Агент создаёт запрос

Создать запрос агентского доступа

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests
Авторизация
Не требуется
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
201

Передайте данные агента и права, которые нужны для его первого профиля. project_id и role_id не передаются: проект определяется по подтверждающему человеку, роль выбирает backend во время одобрения.

Параметры запроса

  • owner_email (string, обязательный) — e-mail подтверждающего пользователя, до 255 символов;
  • agent_name (string, обязательный) — отображаемое имя агента, от 1 до 255 символов;
  • agent_login (string, необязательный) — уникальный технический login, от 3 до 255 символов. Если не передать, backend сформирует его из имени и UUID запроса;
  • permissions (string[], необязательный) — до 100 уникальных permissions с guard_name = user;
  • purpose (string, необязательный) — назначение агента, до 5000 символов.

Пример запроса

{
	"owner_email": "owner@example.com",
	"agent_name": "Order Assistant",
	"agent_login": "agent-order-assistant",
	"permissions": [
		"view-orders",
		"view-counterparties"
	],
	"purpose": "Читать заказы и готовить сводки"
}

Ответ

{
	"message": "Если такой администратор есть, мы отправили запрос.",
	"request": {
		"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
		"request_token": "<request_token>",
		"expires_at": "2026-08-22T04:30:00+00:00"
	}
}

Сразу сохраните:

  • request.public_id — публичный идентификатор процесса;
  • request.request_token — секрет агентского клиента;
  • request.expires_at — крайний срок одобрения и получения токена.

request_token не отправляется владельцу и не должен попадать в URL, логи или контекст модели.

Ответ 201 не гарантирует доставку письма. Gigma не раскрывает существование owner_email, а повторное письмо одному подтверждающему ограничено интервалом 10 минут. Не создавайте новый запрос сразу после успешного ответа.

Ошибки

  • 422 — не прошла валидация поля или указано несуществующее permission;
  • 429 — превышен лимит создания запросов.

Шаг 2. Владелец проверяет запрос

В письме находится ссылка вида:

https://api.gigma.ru/api/agent-access-requests/{publicId}/review#approval_token=<secret>

approval_token размещён во fragment, поэтому браузер не отправляет его серверу как часть HTTP-запроса. Страница подтверждения читает секрет, удаляет его из адресной строки и передаёт в JSON body.

Открыть страницу подтверждения

Метод
GET
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review
Авторизация
Не требуется
Headers
Accept: text/html
Успешный ответ
200

Параметры пути

  • publicId (string, обязательный) — UUID из ответа создания запроса.

Пример запроса

GET /api/agent-access-requests/3f48862d-516d-4c7b-b486-9b7bb205f920/review HTTP/1.1
Host: api.gigma.ru
Accept: text/html

Ответ

HTML-страница подтверждения. Секрет берётся из fragment ссылки и не должен передаваться в query string.

Получить данные запроса для проверки

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review
Авторизация
Approval token из письма
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • approval_token (string, обязательный) — секрет из fragment ссылки.

Пример запроса

{
	"approval_token": "<approval_token>"
}

Ответ

{
	"status": "pending",
	"request": {
		"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
		"agent_name": "Order Assistant",
		"agent_login": "agent-order-assistant",
		"role": {
			"id": 14,
			"name": "employee"
		},
		"requested_permissions": [
			"view-orders",
			"view-counterparties"
		],
		"approved_permissions": null,
		"purpose": "Читать заказы и готовить сводки",
		"expires_at": "2026-08-22T04:30:00+00:00"
	}
}

Если approval_token передан в query string, backend возвращает 422. Неверный секрет маскируется как 404.

Шаг 3. Владелец одобряет или отклоняет

Владелец должен сравнить назначение агента с запрошенными permissions. Для первого запуска лучше сократить права, чем одобрить избыточный набор.

Одобрить агентский доступ

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/approve
Авторизация
Approval token из письма
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • approval_token (string, обязательный) — секрет подтверждения;
  • permissions (string[], необязательный) — итоговое подмножество первоначально запрошенных permissions.

Если permissions не переданы, backend пытается одобрить весь запрошенный набор. Права, которых нет у подтверждающего пользователя, не удаляются автоматически: запрос вернёт 422.

Backend назначает роль employee, а для legacy-проекта — employer. Если подходящей роли нет или пользователь не вправе её назначить, ответ будет 422.

Пример запроса

{
	"approval_token": "<approval_token>",
	"permissions": [
		"view-orders",
		"view-counterparties"
	]
}

Ответ

{
	"status": "approved",
	"message": "Доступ одобрен. Агент может забрать токен."
}

Ошибки

  • 404 — запрос или approval token не найден;
  • 409 — запрос уже обработан либо истёк;
  • 422 — permissions шире исходного запроса или недоступны подтверждающему.

Отклонить агентский доступ

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/decline
Авторизация
Approval token из письма
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • approval_token (string, обязательный) — секрет подтверждения.

Пример запроса

{
	"approval_token": "<approval_token>"
}

Ответ

{
	"status": "declined",
	"message": "Запрос доступа отклонён."
}

Шаг 4. Агент проверяет статус

Проверить статус запроса

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/status
Авторизация
Request token агентского клиента
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • request_token (string, обязательный) — секрет из ответа создания запроса.

Пример запроса

{
	"request_token": "<request_token>"
}

Ответ

{
	"status": "approved",
	"expires_at": "2026-08-22T04:30:00+00:00",
	"server_time": "2026-08-22T04:05:12+00:00"
}

Используйте интервал опроса не меньше 3–5 секунд. После 429 увеличьте интервал и учтите Retry-After, если заголовок присутствует.

Остановите опрос после declined, expired или consumed. После approved сразу переходите к consume.

request_token передаётся только в JSON body. Query string отклоняется с 422, неверный секрет возвращает 404.

Шаг 5. Агент получает первый токен

Создать учётную запись агента и получить первый токен

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/consume
Авторизация
Request token агентского клиента
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Вызывайте endpoint только после статуса approved.

Параметры запроса

  • request_token (string, обязательный) — секрет из ответа создания запроса.

Пример запроса

{
	"request_token": "<request_token>"
}

Ответ

Первый успешный ответ:

{
	"status": "consumed",
	"agent": {
		"id": 214,
		"name": "Order Assistant",
		"login": "agent-order-assistant"
	},
	"agent_token": {
		"id": 901,
		"name": "mcp-self-service",
		"value": "<agent_bearer>",
		"expires_at": "2027-08-22T04:05:20+00:00"
	}
}

agent_token.value показывается только в этом ответе. Сохраните его в хранилище секретов до завершения операции.

Повторный вызов возвращает только состояние:

{
	"status": "consumed",
	"already_consumed": true
}

Backend окончательно проверяет уникальность agent_login во время consume. Если login занят, ответ будет 409; изменить login в одобренном запросе нельзя — создайте новый запрос.

Перед созданием агента backend повторно проверяет подтверждающего пользователя и его проект. Временный 403 или конфликт проекта можно устранить и повторить consume, пока не истёк общий 30-минутный срок.

Шаг 6. Проверьте Agent Token

GET /api/user HTTP/1.1
Host: api.gigma.ru
Authorization: Bearer <agent_token>
Accept: application/json

Сверьте:

  • login агента;
  • состояние is_banned;
  • роль и филиал;
  • фактический список permissions.

После проверки включите только нужные методы из раздела Настройте рабочие методы.

Логика агентского клиента

Рекомендуемый алгоритм:

создать запрос
→ сохранить public_id, request_token, expires_at
→ показывать пользователю состояние pending
→ опрашивать status каждые 3–5 секунд
→ approved: один раз вызвать consume
→ атомарно сохранить Agent Token
→ GET /api/user
→ удалить request_token из оперативного состояния

Не запускайте несколько consume параллельно и не создавайте новый запрос доступа после каждого сетевого timeout.

Восстановление после ошибок

СитуацияДействие
Письмо не пришлопроверить e-mail подтверждающего и папку «Спам»; не отправлять повторный запрос раньше 10 минут
pending длится до expires_atсоздать новый запрос и проверить, что подтверждающий пользователь подходит
declinedпоказать отказ; новый запрос создавать только после изменения требуемых прав или назначения
409 Agent login is already takenвыбрать другой login и создать новый запрос
consume завершился timeoutсначала проверить status; при consumed токен восстановить нельзя
Agent Token потерянчеловек выпускает новый токен через административный API
401 на GET /api/userпрекратить вызов инструментов и запросить новый токен
403 на рабочем методене обходить запрет другим endpoint; сверить permissions и policy

Секреты

Храните request_token и agent_token.value только в хранилище секретов. Никогда не помещайте их в URL, query string, аналитику, сообщения об ошибках и access-логи.

approval_token приходит только во fragment ссылки, сформированной Gigma. Не переносите его из fragment в query string и не копируйте в логи или контекст модели.

В базе Gigma request_token и approval_token хранятся в виде hash. Значение Agent Token повторно не показывается.

Текущие ограничения запросов

EndpointОграничение
POST /api/agent-access-requests5/min
GET /api/agent-access-requests/{publicId}/review30/min
POST /api/agent-access-requests/{publicId}/review30/min
POST /api/agent-access-requests/{publicId}/approve10/min
POST /api/agent-access-requests/{publicId}/decline10/min
POST /api/agent-access-requests/{publicId}/status30/min
POST /api/agent-access-requests/{publicId}/consume10/min

Это текущая runtime-конфигурация routes, а не бессрочное продуктовое обещание. Клиент должен корректно обрабатывать 429.

Готово

Агент создал запрос, владелец одобрил permissions, первый токен сохранён, а подключение проверено через GET /api/user.

Для ротации, отключения или ручного создания учётной записи откройте Управление агентами и токенами.